package com.grupobbva.seguridad.web.servlet.action;

import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.struts.ContextLoaderPlugIn;

import com.grupobbva.seguridad.domain.Aplicacion;
import com.grupobbva.seguridad.domain.Control;
import com.grupobbva.seguridad.domain.ControlPK;
import com.grupobbva.seguridad.domain.Opcion;
import com.grupobbva.seguridad.domain.OpcionImagen;
import com.grupobbva.seguridad.domain.OpcionPK;
import com.grupobbva.seguridad.domain.TablaDetalle;
import com.grupobbva.seguridad.service.AdministracionService;
import com.grupobbva.seguridad.service.SeguridadService;
import com.grupobbva.seguridad.util.Constante;
import com.grupobbva.seguridad.util.ResultadoOperacion;
import com.grupobbva.seguridad.util.ResultadoOperacionExito;
import com.grupobbva.seguridad.util.Util;

@Controller
public class MantenimientoOpcionController extends BaseController {
	
	private static final Logger log=Logger.getLogger(MantenimientoOpcionController.class);
	
	
	@Autowired
	private SeguridadService seguridadService;

	@Autowired
	private AdministracionService administracionService;
	
	@RequestMapping("/opcmnt.do")
    public String mostrar(HttpServletRequest request) throws Exception {
		request.setAttribute("aplicacion", seguridadService.obtenerAplicacion(getParameterLong(request, "aplicacionId")));
		request.setAttribute("estados", administracionService.obtenerDetalles(Constante.TG_ESTADOS_REGISTRO));		
    	return getRelativeURL("opcmnt");
    }
	
	@RequestMapping("/opclst.do")
    public String listar(HttpServletRequest request) throws Exception {
		Opcion opcion = new Opcion();
		opcion.setId(new OpcionPK(getParameterLong(request, "filtroAplicacionId"), getParameterLong(request, "filtroCodigo")));
		opcion.setNombreCorto(getParameterString(request, "filtroNombreCorto"));
		opcion.setNombreLargo(getParameterString(request, "filtroNombreLargo"));
		opcion.setEstado(new TablaDetalle(getParameterLong(request, "filtroEstadoId")));
		
		request.setAttribute("opciones", seguridadService.obtenerOpciones(opcion));
		
    	return getRelativeURL("opclst");
    }
	
	@RequestMapping("/opcupd.do")
    public String modificar(HttpServletRequest request) throws Exception {
		Opcion opcion = null;
		if(getParameterLong(request, "opcionId") == null) {
			opcion = new Opcion(new OpcionPK(getParameterLong(request, "aplicacionId"),null));
			opcion.setTipo(new TablaDetalle(Constante.TD_OPCION_SUBMENU));
			opcion.setEstado(new TablaDetalle());
			request.getSession().removeAttribute("opcionImagen");
		} else {
			opcion = seguridadService.obtenerOpcion(new OpcionPK(getParameterLong(request, "aplicacionId"), getParameterLong(request, "opcionId")));
			OpcionImagen imagen = seguridadService.obtenerOpcionImagen(opcion.getId());
			request.getSession().setAttribute("opcionImagen", imagen.getDatos());
		}
		request.setAttribute("opcion",   opcion);
		request.setAttribute("tipos",    administracionService.obtenerDetalles(Constante.TG_TIPOS_OPCION));
		request.setAttribute("estados",  administracionService.obtenerDetalles(Constante.TG_ESTADOS_REGISTRO));
		request.setAttribute("opciones", seguridadService.obtenerOpcionesNivelSuperior(opcion.getId()));
    	return getRelativeURL("opcreg");
    }
	
	@RequestMapping("/opcdel.do")
    public String eliminar(HttpServletRequest request) throws Exception {
    	ResultadoOperacion resultado = null;
		try {
			String codigoMensaje  = "opcion.eliminar.exito";
						
			seguridadService.eliminarOpcion(new Opcion(new OpcionPK(getParameterLong(request, "aplicacionId"),getParameterLong(request, "opcionId"))));
			
			resultado = new ResultadoOperacionExito(Util.getMessage(codigoMensaje));
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeAjaxURL(request, resultado);
    }
	
	@RequestMapping("/opcuplimg.do")
    public String uploadImage(@RequestParam("imagen") MultipartFile imagen, HttpServletRequest request) throws Exception {
		try {			
			request.getSession().setAttribute("opcionImagen", imagen.getBytes());
		} catch (Exception e) {
			//resultado = guardarMensajeError(request, e);
			log.error(e.getMessage(),e);
		}
    	return getRelativeAjaxURL();
    }
	
	@ResponseBody
	@RequestMapping("/opcverimg.do")
    public byte[] mostrarImage(HttpServletRequest request) throws Exception {
		byte[] datos = null;
		if(request.getParameter("appId") != null && request.getParameter("opcId") != null) {
			try {
				datos = seguridadService.obtenerOpcionImagen(new OpcionPK(getParameterLong(request, "appId"), getParameterLong(request, "opcId"))).getDatos();
				if (datos == null) {
					//WebApplicationContext ctx = (WebApplicationContext) getServletContext().getAttribute(ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX);
					//datos = FileUtils.readFileToByteArray(ctx.getResource("/img/icon_flecha.gif").getFile());
				}
			} catch (Exception e) {			log.error(e.getMessage(),e);}
		} else if(request.getSession().getAttribute("opcionImagen") != null) {
			datos = (byte[]) request.getSession().getAttribute("opcionImagen");
		}
		return datos;
    }
	
	@RequestMapping("/opcupdosp.do")
    public String cambiarTipoOpcion(HttpServletRequest request) throws Exception {
		request.setAttribute("opciones", seguridadService.obtenerOpcionesNivelSuperior(new OpcionPK(getParameterLong(request, "aplicacionId"),getParameterLong(request, "opcionId"))));
    	return getRelativeURL("opcregosp");
    }
	
	@RequestMapping("/opcupdord.do")
    public String cambiarOpcionSuperior(HttpServletRequest request) throws Exception {
		int cantidad = ("true".equals(request.getParameter("nuevo")))?1:0;
		request.setAttribute("cantidad", seguridadService.obtenerOpcionesNivelInferiorCantidad(new OpcionPK(getParameterLong(request, "aplicacionId"),getParameterLong(request, "opcionId")))+cantidad);
    	return getRelativeURL("opcregord");
    }
	@RequestMapping("/opcreg.do")
    public String grabar(@ModelAttribute("opcion") Opcion opcion, HttpServletRequest request) throws Exception {
		ResultadoOperacion resultado = null;
		try {
				String codigoMensaje  = "opcion."+((opcion.getId().getOpcionId()==null)?"registrar":"modificar")+".exito";
				seguridadService.registrarOpcion(opcion);
				seguridadService.registrarOpcion(new OpcionImagen(opcion.getId(), (byte[])request.getSession().getAttribute("opcionImagen")));
				
				resultado = new ResultadoOperacionExito(Util.getMessage(codigoMensaje));
			
			
			
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeAjaxURL(request, resultado);
    }
	@RequestMapping("/opcctlupd.do")
    public String mostrarControl(HttpServletRequest request) throws Exception {
		Control control = new Control();
		control.setId(new ControlPK(getParameterLong(request, "aplicacionId"), getParameterLong(request, "opcionId"), null));
		control.setTipo(new TablaDetalle());
		control.setEstado(new TablaDetalle());
		request.setAttribute("control", control);
		request.setAttribute("tipos"  , administracionService.obtenerDetalles(Constante.TG_TIPOS_CONTROL));
		request.setAttribute("estados", administracionService.obtenerDetalles(Constante.TG_ESTADOS_REGISTRO));		
    	return getRelativeURL("opcctlreg");
    }
	@RequestMapping("/opcctldel.do")
    public String eliminarControl(HttpServletRequest request) throws Exception {
		ResultadoOperacion resultado = null;
		try {
			String codigoMensaje  = "control.eliminar.exito"; 
			
			seguridadService.eliminarControl(new Control(new ControlPK(getParameterLong(request, "aplicacionId"), getParameterLong(request, "opcionId"), getParameterLong(request, "controlId"))));
			
			resultado = new ResultadoOperacionExito(Util.getMessage(codigoMensaje));
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeAjaxURL(request, resultado);
    }	
	@RequestMapping("/opcctllst.do")
    public String listarControl(HttpServletRequest request) throws Exception {
		Control control = new Control(new ControlPK(getParameterLong(request, "aplicacionId"), getParameterLong(request, "opcionId"), null));
		request.setAttribute("controles", seguridadService.obtenerControles(control));
    	return getRelativeURL("opcctllst");
    }
	@RequestMapping("/opcctlreg.do")
    public String grabarControl(@ModelAttribute("control") Control control, HttpServletRequest request) throws Exception {
		ResultadoOperacion resultado = null;
		try {
			String codigoMensaje  = "control."+((control.getId().getControlId()==null)?"registrar":"modificar")+".exito";
			
			seguridadService.registrarControl(control, getUsuario(request));
			
			resultado = new ResultadoOperacionExito(Util.getMessage(codigoMensaje));
		} catch (Exception e) {
			resultado = guardarMensajeError(request, e);
		}
    	return getRelativeAjaxURL(request, resultado);
    }
}
